package org.jaaksi.kottlindemo.test

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.Message
import androidx.appcompat.app.AppCompatActivity
import org.jaaksi.kottlindemo.databinding.ActivityTestFlowBinding

class TestLeakActivity : AppCompatActivity() {
    private val binding by lazy { ActivityTestFlowBinding.inflate(layoutInflater) }
    private val name = "哈哈哈"

    private val handler: Handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            println(">> handleMessage")
            // Handler (org.jaaksi.kottlindemo.test.TestLeakActivity$handler$1) {6c8453d}
            // 这里不会泄漏，这里的handler对象是存储在msg中的，而msg是在MessageQue中的。
            // 这里的Handler未持有Activity的引用，页面销毁时，这里的handler引用会自动释放，但handler对象不会被销毁
//            println(">> ${msg.target}")

            // 如果这样就会泄漏，这里Handler持有了Activity的引用
             println(">> $name")
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.btn2.setOnClickListener {
            finish()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        println(">> onDestroy")
        // Msg存放在消息队列中，如果Msg和Handler不持有Activity的引用
        handler.sendMessageDelayed(Message.obtain(), 10000)
//        handler.postDelayed({
//            // 当handle中的Runnable没有持有Activity的引用时，不会造成内存泄漏，且Runnable会得到执行
////            println(">> person = $name")
////            println(">> $handler")
//            println(">> runnable end")
//        }, 10000)
//        GlobalScope.launch {
//            println(">> ${Thread.currentThread()}")
//            delay(10000)
////            println(">> person = $name") // 持有Activity的引用，会造成泄漏
//        }
    }
}